home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 2 / Atari Mega Archive CD - Volume 2.iso / minix / up1510b.tgz / up1510b / src / commands / chmem.c < prev    next >
C/C++ Source or Header  |  1990-07-23  |  4KB  |  109 lines

  1. /* chmem - set total memory size for execution    Author: Andy Tanenbaum */
  2.  
  3. #include <sys/types.h>
  4. #include <fcntl.h>
  5. #include <stdlib.h>
  6. #include <unistd.h>
  7.  
  8. /* Should include a.out.h or exec.h.  Here is an approximation. */
  9. #define HLONG            8    /* header size in longs */
  10. #define TEXT             2    /* where is text size in header */
  11. #define DATA             3    /* where is data size in header */
  12. #define BSS              4    /* where is bss size in header */
  13. #define TOT              6    /* where in header is total allocation */
  14. #define TOTPOS          24    /* where is total in header */
  15. #define SEPBIT  0x00200000    /* this bit is set for separate I/D */
  16. #define MAGIC       0x0301    /* magic number for executable progs */
  17. #define MAX_8086   0x10000L    /* maximum allocation size for 8086 */
  18. #define MAX_386 0x7FFFFFFFL    /* etc */
  19. #define MAX_68K 0x7FFFFFFFL
  20. #define CPU_8086         4    /* CPU code for 8086 executables */
  21. #define CPU_386       0x10    /* etc */
  22. #define CPU_68K       0x0B    /* from Minix-PC a.out.h - unreliable */
  23.  
  24. main(argc, argv)
  25. int argc;
  26. char *argv[];
  27. {
  28. /* The 8088 architecture does not make it possible to catch stacks that grow
  29.  * big.  The only way to deal with this problem is to let the stack grow down
  30.  * towards the data segment and the data segment grow up towards the stack.
  31.  * Normally, a total of 64K is allocated for the two of them, but if the
  32.  * programmer knows that a smaller amount is sufficient, he can change it
  33.  * using chmem.
  34.  *
  35.  * chmem =4096 prog  sets the total space for stack + data growth to 4096
  36.  * chmem +200  prog  increments the total space for stack + data growth by 200
  37.  */
  38.  
  39.   char *p;
  40.   int fd, separate;
  41.   long lsize, olddynam, newdynam, newtot, overflow, header[HLONG];
  42.   char cpu;
  43.   long max;
  44.  
  45.   if (argc != 3) usage();
  46.   p = argv[1];
  47.   if (*p != '=' && *p != '+' && *p != '-') usage();
  48.   lsize = atol(p + 1);
  49.  
  50.   fd = open(argv[2], O_RDWR);
  51.   if (fd < 0) stderr3("chmem: can't open ", argv[2], "\n");
  52.  
  53.   if (read(fd, (char *) header, sizeof(header)) != sizeof(header))
  54.     stderr3("chmem: ", argv[2], "bad header\n");
  55.   if ((header[0] & 0xFFFFL) != MAGIC)
  56.     stderr3("chmem: ", argv[2], " not executable\n");
  57.   separate = (header[0] & SEPBIT ? 1 : 0);
  58.  
  59.   cpu = (char) (header[0] >> 24);    /* cpu byte is most significant */
  60.   if (cpu == CPU_8086 && *(unsigned short *) &header[0] != MAGIC)
  61.     cpu = CPU_68K;        /* 8086 code with 68K byte order == 68K */
  62.   switch(cpu) {
  63.     case CPU_8086:    max = MAX_8086;    break;
  64.     case CPU_386:    max = MAX_386;    break;
  65.     case CPU_68K:    max = MAX_68K;    break;
  66.     default:    stderr3("chmem: ", argv[2], "bad CPU type\n");
  67.   }  
  68.  
  69.   if (lsize < 0) stderr3("chmem: ", p+1, " negative size not allowed\n");
  70.   if (lsize > max) stderr3("chmem: ", p + 1, " too large\n");
  71.  
  72.   olddynam = header[TOT] - header[DATA] - header[BSS];
  73.   if (separate == 0) olddynam -= header[TEXT];
  74.  
  75.   if (*p == '=')
  76.     newdynam = lsize;
  77.   else if (*p == '+')
  78.     newdynam = olddynam + lsize;
  79.   else if (*p == '-')
  80.     newdynam = olddynam - lsize;
  81.  
  82.   newtot = header[DATA] + header[BSS] + newdynam;
  83.   if (separate == 0) newtot += header[TEXT];
  84.   overflow = (newtot > max ? newtot - max : 0);
  85.   newdynam -= overflow;
  86.   newtot -= overflow;
  87.   lseek(fd, (long) TOTPOS, SEEK_SET);
  88.   if (write(fd, (char *) &newtot, 4) < 0)
  89.     stderr3("chmem: can't modify ", argv[2], "\n");
  90.   printf("%s: Stack+malloc area changed from %ld to %ld bytes.\n",
  91.          argv[2], olddynam, newdynam);
  92.   exit(0);
  93. }
  94.  
  95. usage()
  96. {
  97.   std_err("chmem {=+-} amount file\n");
  98.   exit(1);
  99. }
  100.  
  101. stderr3(s1, s2, s3)
  102. char *s1, *s2, *s3;
  103. {
  104.   std_err(s1);
  105.   std_err(s2);
  106.   std_err(s3);
  107.   exit(1);
  108. }
  109.